package com.vehiclesecure.repository;

import com.vehiclesecure.model.Vehicle;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 车辆信息数据访问层
 * 提供车辆信息的CRUD操作
 */
@Repository
public interface VehicleRepository extends MongoRepository<Vehicle, String> {
    
    /**
     * 根据VIN码查找车辆
     * @param vin VIN码
     * @return 车辆信息
     */
    Optional<Vehicle> findByVin(String vin);
    
    /**
     * 根据车牌号查找车辆
     * @param licensePlate 车牌号
     * @return 车辆信息
     */
    Optional<Vehicle> findByLicensePlate(String licensePlate);
    
    /**
     * 根据VIN码或车牌号查找车辆
     * @param vin VIN码
     * @param licensePlate 车牌号
     * @return 车辆信息
     */
    Optional<Vehicle> findByVinOrLicensePlate(String vin, String licensePlate);
    
    /**
     * 检查VIN码是否已存在
     * @param vin VIN码
     * @return 是否存在
     */
    boolean existsByVin(String vin);
    
    /**
     * 检查车牌号是否已存在
     * @param licensePlate 车牌号
     * @return 是否存在
     */
    boolean existsByLicensePlate(String licensePlate);
    
    /**
     * 根据车主ID查找车辆
     * @param ownerId 车主用户ID
     * @return 车辆列表
     */
    List<Vehicle> findByOwnerId(String ownerId);
    
    /**
     * 根据车主邮箱查找车辆
     * @param ownerEmail 车主邮箱
     * @return 车辆列表
     */
    List<Vehicle> findByOwnerEmail(String ownerEmail);
    
    /**
     * 根据车辆状态查找车辆
     * @param status 车辆状态
     * @return 车辆列表
     */
    List<Vehicle> findByStatus(String status);
    
    /**
     * 根据品牌查找车辆
     * @param brand 品牌
     * @return 车辆列表
     */
    List<Vehicle> findByBrand(String brand);
    
    /**
     * 根据品牌和型号查找车辆
     * @param brand 品牌
     * @param model 型号
     * @return 车辆列表
     */
    List<Vehicle> findByBrandAndModel(String brand, String model);
    
    /**
     * 根据设备ID查找车辆
     * @param deviceId 设备ID
     * @return 车辆信息
     */
    Optional<Vehicle> findByDeviceId(String deviceId);
    
    /**
     * 根据设备序列号查找车辆
     * @param deviceSerialNumber 设备序列号
     * @return 车辆信息
     */
    Optional<Vehicle> findByDeviceSerialNumber(String deviceSerialNumber);
    
    /**
     * 查找授权用户包含指定用户ID的车辆
     * @param userId 用户ID
     * @return 车辆列表
     */
    @Query("{ 'authorizedUsers' : ?0 }")
    List<Vehicle> findByAuthorizedUsersContaining(String userId);
    
    /**
     * 根据标签查找车辆
     * @param tag 标签
     * @return 车辆列表
     */
    @Query("{ 'tags' : ?0 }")
    List<Vehicle> findByTagsContaining(String tag);
    
    /**
     * 查找激活状态的车辆
     * @return 激活车辆列表
     */
    List<Vehicle> findByIsActiveTrue();
    
    /**
     * 查找被盗状态的车辆
     * @return 被盗车辆列表
     */
    List<Vehicle> findByIsStolenTrue();
    
    /**
     * 统计车主的车辆数量
     * @param ownerId 车主ID
     * @return 车辆数量
     */
    long countByOwnerId(String ownerId);
    
    /**
     * 根据燃料类型查找车辆
     * @param fuelType 燃料类型
     * @return 车辆列表
     */
    List<Vehicle> findByFuelType(String fuelType);
    
    /**
     * 根据车辆类型查找车辆
     * @param vehicleType 车辆类型
     * @return 车辆列表
     */
    List<Vehicle> findByVehicleType(String vehicleType);
    
    /**
     * 查找保险即将到期的车辆
     * @param date 日期
     * @return 车辆列表
     */
    @Query("{ 'insuranceExpiry' : { $lte : ?0 } }")
    List<Vehicle> findByInsuranceExpiryLessThanEqual(LocalDateTime date);
    
    /**
     * 查找需要保养的车辆（根据里程数或时间）
     * @param mileage 里程数阈值
     * @return 车辆列表
     */
    List<Vehicle> findByMileageGreaterThanEqual(Integer mileage);
}